fn main() {
    // 1.
    fn add_one(i: u32) -> u32 {
        i + 1
    }

    fn add_twice(add: fn(u32) -> u32, args: u32) -> u32 {
        add(args) + add(args)
    }

    let fn2 = add_twice(add_one, 2);
    println!("fn2: {}", fn2);
    // 2.
    let list_of_numbers = vec![1,2,3,4,5];
    // 注意, 此处要标注类型Vec<String>
    // let list_of_strings:Vec<String> = list_of_numbers.iter().map(|x| x.to_string()).collect();
    // 同样可以使用
    let list_of_strings:Vec<String> = list_of_numbers.iter().map(ToString::to_string).collect();
    println!("list_of_strings: {:?}", list_of_strings);
    // 3. 枚举函数指针
    #[derive(Debug)]
    enum Status {
        Value(u32),
        Stop,
    }
    // 注意, 这里是元组
    let list_of_status:Vec<Status> = (0u32..12).map(Status::Value).collect();
    println!("list_of_status:{:?}", list_of_status);
    // 4. 函数不可以返回闭包, 但是可返回实现了闭包的类型
    // fn returns_closures() -> Fn<u32> {
    //     |x:u32| u32
    // }
    fn returns_closures() -> Box<dyn Fn(u32) -> u32>{
        Box::new(|x:u32| x)
    }

    let fn3 = returns_closures();
    // 返回的Box类型可以直接用
    let res3 = fn3(12);
    println!("fn3: {}", res3);
}